/*******************************************************************************
* 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
* 版本：v1.0.0<br>
* 文件：AppViewComponent.js<br>
* 日期：2017年9月29日<br>
* 作者: 杨顺强<br>
* 功能：应用程序组件对象基类，定义组件对象基本接口<br>
* 
* 修改记录：<br>
* 日期 描述 更新功能<br>
******************************************************************************/
 
window.makeNamespace(window,"Rainier.UI.V2");

Rainier.UI.V2.AppPartLibComponent = Rainier.UI.V2.AppViewComponent.extend({

 	NAME : "Rainier.UI.V2.AppPartLibComponent",

 	/**
	 * 函数名称：init<br>
	 * 函数功能：构造函数<br>
	 * 参数信息：app : 应用程序对象，
	 * 异常信息：无<br>
	 */
 	init : function(app,parentContainer){
        this._super(app,parentContainer);
 		this.container 						 = $('<div class="app-partlib clearfix"></div>');
 		this.isSearchedResult				 = false;
 		var partLibName                      = this.context.getPartLib();
 		this.partlib                         = Rainier.UI.V2.PartLibList.getChildren(partLibName);
 		this.partFactory                     = new Rainier.UI.V2.Circuit.Ac.PartFactory();
 		this.partlibSelectionChangeListener  = this.context.getPartLibSelectionChangeListener();
 		this.partlibSelectionChangePublisher = new Rainier.UI.V2.PartLibSelectionChangePublisher();
 		if(!this.partlibSelectionChangeListener){
 			var message = "元件选中监听器必须存在，请检查程序，进行修改！！";
 			throw new Error(message);
 		}
 		this.partlibSelectionChangePublisher.attachSelectionChangeListener(this.partlibSelectionChangeListener);
 	},

 	/**
	 * 函数名称：createView<br>
	 * 函数功能：根据参数信息： 是否存在容器元素，进行不同形式的布局设置<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	createView : function(){
 		if(this.parentContainer){
            this.container.appendTo(this.parentContainer);
        }else{
            this.container.appendTo($("body"));
        }
 		this.createViewDom(this.partlib);
 	},

 	/**
	 * 函数名称：createViewDom<br>
	 * 函数功能：创建当前组件的dom元素<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	createViewDom : function(partlib){
 		var _this = this;
 		$.each(partlib,function(index,part){

 			var partInfo  = part.data?part.data:part;
 			var imgSrc    = null;
 			var className = null;

 			//1、处理逻辑元件和真实元件图形问题：
 			// if(partInfo.isLogic){
 			// 	if(partInfo.deviceType !== "DeviceModel"){
 			// 		imgSrc    = "./resource/partlibImg/"+partInfo.className+".svg";
 			// 	}else{
 			// 		imgSrc    = "./resource/partlibImg/"+partInfo.className+".png";
 			// 	}
 			// }else{
 				//此处执行 eval操作，获取modelJson 中的img数据，并赋值；
 				var json  = eval ("(" + "Rainier.UI.V2.Communication."+ partInfo.className + ")");
 				imgSrc    = json.uiProperty.imageString;	
 			//}

 			// 2、处理元件类型问题：普通元件、虚拟元件、动态元件

 			var options = {
 				"imgSrc"       : imgSrc,
 				"className"    : partInfo.className,
 				"componentName": partInfo.componentName,
 				"deviceType"   : partInfo.deviceType,
 			};
 			var button = new Rainier.UI.V2.ButtonComponent(_this.container,options);
 			button.bindClickEvent(function(){
 				//此处使用partLibSelectionChangepublich,向外发送事件给Listener,更新选中的model
 				var selectedObj = {};
 				var className   = $(button.imgContainer).data("classname");
 				var deviceType  = $(button.imgContainer).data("devicetype");
 				selectedObj.factory        = _this.partFactory;
 				selectedObj.json           = "Rainier.UI.V2."+partInfo.courseType+"." + className;
 				selectedObj.modelClassName = "Rainier.UI.V2." + deviceType;
 				// if(deviceType !== "DeviceModel"){
 				// 	selectedObj.json           = "Rainier.UI.V2.Virtual." + className;
 				// }
 				_this.partlibSelectionChangePublisher.fireSelectionChangeObject(selectedObj);
 			});
 		});
 	},

 	/**
	 * 函数名称：clickToShow<br>
	 * 函数功能：点击元件库控制按钮去显示元件库<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	clickToShow : function(){
 		$(".app-property").css("display","none");
 		this.container.css("display","block");
 	},

 	/**
	 * 函数名称：clickToHide<br>
	 * 函数功能：点击元件库控制按钮去隐藏元件库<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	clickToHide : function(){
 		if(this.isSearchedResult){
 			this.clearContainer();
 			this.createViewDom(this.partlib);
 		}
 		this.container.css("display","none");
 	},

 	/**
	 * 函数名称：clearContainer<br>
	 * 函数功能：清空元件库中的元件<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	clearContainer : function(){
 		this.container.empty();
 	},

 	/**
	 * 函数名称：createView<br>
	 * 函数功能：对组件中的控制元素，进行事件绑定，此处，调用context内部的功能函数<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	bindCallBackFn : function(){
 		// throw new Error("此函数有子类实现,当前对象可理解为抽象类，不向外提供实例，谢谢配合");
 	},

 	/**
	 * 函数名称：enableComponent<br>
	 * 函数功能：启用组件内部功能<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	enableComponent : function(){
 		throw new Error("此函数有子类实现,当前对象可理解为抽象类，不向外提供实例，谢谢配合");
 	},

 	/**
	 * 函数名称：disableComponent<br>
	 * 函数功能：禁用组件功能<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	disableComponent : function(){
 		throw new Error("此函数有子类实现,当前对象可理解为抽象类，不向外提供实例，谢谢配合");
 	},
});


Rainier.UI.V2.ButtonComponent = Rainier.Basic.CompositeObject.extend({

 	NAME : "Rainier.UI.V2.ButtonComponent",

 	/**
	 * 函数名称：init<br>
	 * 函数功能：构造函数<br>
	 * 参数信息：app : 应用程序对象，
	 * 异常信息：无<br>
	 */
 	init : function($container,options){
 		if(!$container || !options){
 			var message = "$container,或options参数赋值有误，请检查程序，重新复制";
 			throw new Error(message);
 		}
 		this.container = this.createViewDom();
 		this.options   = {imgSrc:"",className:"",componentName:""};
 		this.imgContainer  = null;
 		this.textContainer = null;
 		$.extend(true,this.options,options);
 		this.createView($container);
 	},

 	/**
	 * 函数名称：createView<br>
	 * 函数功能：根据参数信息： 是否存在容器元素，进行不同形式的布局设置<br>
	 * 参数输入：$container : 当前组件容器元素<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	createView : function($container){
 		$container.append(this.container);
 		var imgDiv   = $('<div class="app-partlib-part-img"></div>');
 		var spanDiv  = $('<div class="app-partlib-part-text"></div>');
 		this.imgContainer = $('<a class="app-partlib-part-img-content" ></a>');
 		this.textContainer = $('<span class="app-partlib-part-text-content"></span>');
 		
 		imgDiv.appendTo(this.container);
 		spanDiv.appendTo(this.container);
 		this.imgContainer.appendTo(imgDiv);
 		this.textContainer.appendTo(spanDiv);
 		this.textContainer.html(this.options.componentName);
 		this.imgContainer.attr("data-classname",this.options.className);
 		this.imgContainer.attr("data-deviceType",this.options.deviceType);
 		this.imgContainer.append($("<img></img>").attr("src",this.options.imgSrc));
 	},

 	/**
	 * 函数名称：createViewDom<br>
	 * 函数功能：创建当前组件的dom元素<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	createViewDom : function(){
 		var dom = '<div class="app-partlib-part"></div>';
		var container = $(dom);
		return container;
 	},

	/**
	 * 函数名称：bindClickEvent<br>
	 * 函数功能：绑定点击事件的回调函数<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */ 	
 	bindClickEvent : function(callBackFn){
 		var className = $(this.imgContainer).data("className");
 		$(this.imgContainer).on("click",callBackFn);
 	},

 	/**
	 * 函数名称：enableComponent<br>
	 * 函数功能：启用组件内部功能<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	enableComponent : function(){
 		this.$imgContainer.attr("disabled",false)
 	},

 	/**
	 * 函数名称：disableComponent<br>
	 * 函数功能：禁用组件功能<br>
	 * 参数输入：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
 	disableComponent : function(){
 		this.$imgContainer.attr("disabled","disabled");
 	},
});
